"""
日志管理器
提供统一的日志记录功能
"""
import os
import sys
from datetime import datetime
from loguru import logger
from config.test_config import TestConfig


class Logger:
    """日志管理器类"""
    
    _instance = None
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance
    
    def __init__(self):
        if not hasattr(self, 'initialized'):
            self.initialized = True
            self._setup_logger()
    
    def _setup_logger(self):
        """设置日志配置"""
        # 移除默认的日志处理器
        logger.remove()
        
        # 确保日志目录存在
        os.makedirs(TestConfig.LOG_DIR, exist_ok=True)
        
        # 获取当前日期作为日志文件名
        current_date = datetime.now().strftime("%Y-%m-%d")
        log_file = os.path.join(TestConfig.LOG_DIR, f"test_{current_date}.log")
        
        # 控制台日志格式
        console_format = (
            "<green>{time:YYYY-MM-DD HH:mm:ss}</green> | "
            "<level>{level: <8}</level> | "
            "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> | "
            "<level>{message}</level>"
        )
        
        # 文件日志格式
        file_format = (
            "{time:YYYY-MM-DD HH:mm:ss} | "
            "{level: <8} | "
            "{name}:{function}:{line} | "
            "{message}"
        )
        
        # 添加控制台处理器
        logger.add(
            sys.stdout,
            format=console_format,
            level=TestConfig.LOG_LEVEL,
            colorize=True
        )
        
        # 添加文件处理器
        logger.add(
            log_file,
            format=file_format,
            level=TestConfig.LOG_LEVEL,
            rotation="00:00",  # 每天轮换
            retention="30 days",  # 保留30天
            compression="zip",  # 压缩旧日志
            encoding="utf-8"
        )
        
        # 添加错误日志文件
        error_log_file = os.path.join(TestConfig.LOG_DIR, f"error_{current_date}.log")
        logger.add(
            error_log_file,
            format=file_format,
            level="ERROR",
            rotation="00:00",
            retention="30 days",
            compression="zip",
            encoding="utf-8"
        )
    
    def get_logger(self):
        """获取日志记录器"""
        return logger
    
    def log_test_start(self, test_name):
        """记录测试开始"""
        logger.info(f"开始执行测试: {test_name}")
    
    def log_test_end(self, test_name, status="PASS"):
        """记录测试结束"""
        logger.info(f"测试执行完成: {test_name} - {status}")
    
    def log_step(self, step_name):
        """记录测试步骤"""
        logger.info(f"执行步骤: {step_name}")
    
    def log_assertion(self, assertion_name, result):
        """记录断言结果"""
        if result:
            logger.info(f"断言通过: {assertion_name}")
        else:
            logger.error(f"断言失败: {assertion_name}")
    
    def log_error(self, error_message, exception=None):
        """记录错误信息"""
        if exception:
            logger.error(f"{error_message}: {str(exception)}")
        else:
            logger.error(error_message)
    
    def log_warning(self, warning_message):
        """记录警告信息"""
        logger.warning(warning_message)
    
    def log_info(self, info_message):
        """记录信息"""
        logger.info(info_message)
    
    def log_debug(self, debug_message):
        """记录调试信息"""
        logger.debug(debug_message) 